#include <iostream>  
#include <string>  
#include <vector>  
using namespace std;  
  
void restoreIPAddresses(string s, int start, int step, string address, vector<string>& result) {  
    // 如果已经遍历完字符串且找到了四段IP地址，将当前结果加入到结果集中  
    if (start == s.size() && step == 4) {  
        result.push_back(address);  
        return;  
    }  
  
    // 如果当前步数已经超过四步，或者已经遍历完了字符串，直接返回  
    if (step >= 4 || start >= s.size()) {  
        return;  
    }  
  
    // 每次可以取1~3个字符  
    for (int len = 1; len <= 3; len++) {  
        if (start + len > s.size()) {  
            break;  
        }  
  
        // 取出当前片段  
        string segment = s.substr(start, len);  
        int value = stoi(segment);  
  
        // 如果当前片段大于255或者不以0开头但是只有1位，直接跳过  
        if (value > 255 || (segment[0] == '0' && segment.size() > 1)) {  
            continue;  
        }  
  
        // 构造下一个IP地址片段  
        string nextAddress = address.empty() ? segment : address + "." + segment;  
  
        // 递归调用，继续匹配下一个片段  
        restoreIPAddresses(s, start + len, step + 1, nextAddress, result);  
    }  
}  
  
vector<string> restoreIpAddresses(string s) {  
    vector<string> result;  
    restoreIPAddresses(s, 0, 0, "", result);  
    return result;  
}  
  
int main() {  
    string s = "25525511135";  
    vector<string> result = restoreIpAddresses(s);  
    for (int i = 0; i < result.size(); i++) {  
        cout << result[i] << endl;  
    }  
    return 0;  
}